/*
 * @(#)XfspStore.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.controller;

import java.util.ArrayList;
import java.util.Observable;

import xfuzzy.xfsp.XfspEvent;

/**
 * <p> <b>Descripci�n:</b> Almacena los eventos de entrada provenientes tanto
 * del modelo (XfspModel) como de las vistas (<b>XfspView</b>) hasta que el
 * controlador (<b>XfspController</b>) los traslade a su destino.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 2.1
 * @see XfspController
 *
 */
public class XfspStore
    extends Observable {
  //lista donde se almacenar�n los eventos de entrada
  private ArrayList<XfspEvent> store;

  /**
   * <p> <b>Descripci�n:</b> crea un nuevo almac�n de eventos que deben ser
   * atendidos por un controlador.
   *
   */
  public XfspStore() {
    //inicializa la lista de eventos de entrada a una lista vac�a
    store = new ArrayList<XfspEvent>();
  }

  /**
   * <p> <b>Descripci�n:</b> guarda un nuevo evento dentro del almac�n.
   * @param ev Evento que debe ser guardado en el almac�n.
   *
   */
  public synchronized void store(XfspEvent ev) {
    //guardamos el evento de entrada en la lista de eventos
//    store.add(ev);
    store.add(store.size(),ev);
    //indicamos que el estado del objeto observable (almac�n) ha cambiado
    setChanged();
    //noficiamos a todos los observadores del almac�n (controladores) el cambio
    notifyObservers(ev);
  }

  /**
   * <p> <b>Descripci�n:</b> extrae un evento de los que han sido guardados en
   * el almac�n. En caso de que no haya ning�n evento almacenado, devuelve un
   * evento de tipo <b>"null"</b> y con par�metros <b>null</b>.
   * @return Evento extra�do del almac�n.
   *
   */
  public synchronized XfspEvent extract() {
    //evento que ser� devuelto
    XfspEvent event = null;
    //si el almac�n no est� vac�o...
    if (!store.isEmpty()) {
      //...devolvemos el primer elemento de la lista de eventos almacenados
      event = (XfspEvent) store.remove(0);
    }
    //si el almac�n est� vac�o...
    else {
      //...devolvemos un envento de tipo "null" y con par�metros null
      event = new XfspEvent("null", null);
    }
    return event;
  }
}
